SageMaker HyperPod クラスター起動で必要な IAM 周りをまとめてみた

SageMaker HyperPod クラスター起動で必要な IAM 周りをまとめてみた

Clock Icon2025.01.13

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

SageMaker HyperPod を触るにあたり、IAM ロールに追加の IAM ポリシーが必要なケースがいくつか考えられます。今回は Slurm, EKS オーケストレーター別に、必要なケースと IAM ポリシーを洗い出してみたいと思います。

Slurm

Slurm オーケストレータの場合、IAM ロールは SageMaker HyperPod の IAM ロールのみ作成します。信頼ポリシーには、以下を設定します。

assume_sagemaker.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "sagemaker.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

非 VPC 環境(AWS マネージドな VPC 利用)

FSx for Lustre を使わないなど、非 VPC な環境(AWS マネージドな VPC)での利用ケースの場合は、AmazonSageMakerClusterInstanceRolePolicy を SageMaker HyperPod の IAM ロールにアタッチします。

AmazonSageMakerClusterInstanceRolePolicy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CloudwatchLogStreamPublishPermissions",
      "Effect": "Allow",
      "Action": [
        "logs:PutLogEvents",
        "logs:CreateLogStream",
        "logs:DescribeLogStreams"
      ],
      "Resource": [
        "arn:aws:logs:*:*:log-group:/aws/sagemaker/Clusters/*:log-stream:*"
      ]
    },
    {
      "Sid": "CloudwatchLogGroupCreationPermissions",
      "Effect": "Allow",
      "Action": ["logs:CreateLogGroup"],
      "Resource": ["arn:aws:logs:*:*:log-group:/aws/sagemaker/Clusters/*"]
    },
    {
      "Sid": "CloudwatchPutMetricDataAccess",
      "Effect": "Allow",
      "Action": ["cloudwatch:PutMetricData"],
      "Resource": ["*"],
      "Condition": {
        "StringEquals": {
          "cloudwatch:namespace": "/aws/sagemaker/Clusters"
        }
      }
    },
    {
      "Sid": "DataRetrievalFromS3BucketPermissions",
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetObject"],
      "Resource": ["arn:aws:s3:::sagemaker-*"],
      "Condition": {
        "StringEquals": {
          "aws:ResourceAccount": "${aws:PrincipalAccount}"
        }
      }
    },
    {
      "Sid": "SSMConnectivityPermissions",
      "Effect": "Allow",
      "Action": [
        "ssmmessages:CreateControlChannel",
        "ssmmessages:CreateDataChannel",
        "ssmmessages:OpenControlChannel",
        "ssmmessages:OpenDataChannel"
      ],
      "Resource": "*"
    }
  ]
}

https://docs.aws.amazon.com/ja_jp/aws-managed-policy/latest/reference/AmazonSageMakerClusterInstanceRolePolicy.html

VPC 環境

VPC 環境で利用する場合は AmazonSageMakerClusterInstanceRolePolicy に加え、以下のポリシーをアタッチする必要があります。

vpc_policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateNetworkInterface",
        "ec2:CreateNetworkInterfacePermission",
        "ec2:DeleteNetworkInterface",
        "ec2:DeleteNetworkInterfacePermission",
        "ec2:DescribeNetworkInterfaces",
        "ec2:DescribeVpcs",
        "ec2:DescribeDhcpOptions",
        "ec2:DescribeSubnets",
        "ec2:DescribeSecurityGroups",
        "ec2:DetachNetworkInterface"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "ec2:CreateTags",
      "Resource": [
        "arn:aws:ec2:*:*:network-interface/*"
      ]
    }
  ]
}

https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-prerequisites-iam.html#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod

sagemaker- から始まらない S3 バケットの利用

ライフサイクルスクリプトなどで sagemaker- から始まらない、S3 バケットを利用する場合は、追加の権限が必要です。次のポリシーを追加で付与します。対象のバケット ARN は適宜変更します。

s3_policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetObject"
      ],
      "Resource": [
        "対象のバケット ARN",
        "対象のバケット ARN/*",
      ]
    }
  ]
}

管理者

HyperPod クラスターを管理できるように、以下の権限を付与してあげましょう。

ライフサイクルスクリプト、VPC を利用するのであれば VPC とその周辺リソース(Lustre 等)のアクセス権限も付与します。

cluster_admin.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sagemaker:CreateCluster",
        "sagemaker:ListClusters"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "sagemaker:DeleteCluster",
        "sagemaker:DescribeCluster",
        "sagemaker:DescribeClusterNode",
        "sagemaker:ListClusterNodes",
        "sagemaker:UpdateCluster",
        "sagemaker:UpdateClusterSoftware",
        "sagemaker:BatchDeleteClusterNodes"
      ],
      "Resource": "arn:aws:sagemaker:region:account-id:cluster/*"
    }
  ]
}

IAM Group や IAM ロールに付与できる IAM ポリシーの数にはハードリミットがあるため、必要に応じてジョブ管理ポリシーを検討してあげましょう。

研究者

研究者が HyperPod ノードにログインできるよう設定が必要です。SSM 経由でログインできるよう以下を設定します。必要に応じて、ライフサイクルスクリプト用 S3 バケットへのアクセス権限を付与すると良いと思います。

cluster_scientists.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["ssm:StartSession", "ssm:TerminateSession"],
      "Resource": "*"
    }
  ]
}

EKS

EKS オーケストレータの場合、 IAM ロールは SageMaker HyperPod の IAM ロールに加え、EKS クラスターの IAM ロールが必要です。信頼ポリシーはそれぞれ以下で作成します。

SageMaker HyperPod の IAM ロール

assume_sagemaker.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "sagemaker.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

EKS クラスターの IAM ロール

assume_eks.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

SageMaker HyperPod の IAM ロール

EKS の場合は必然的に VPC 環境でのホストになります。そのため、AmazonSageMakerClusterInstanceRolePolicy と VPC 環境で利用する追加のポリシーが必要になります。VPC で利用するためのポリシーですが、 Slurm と EKS で内容が異なるため注意です。

AmazonSageMakerClusterInstanceRolePolicy

AmazonSageMakerClusterInstanceRolePolicy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CloudwatchLogStreamPublishPermissions",
      "Effect": "Allow",
      "Action": [
        "logs:PutLogEvents",
        "logs:CreateLogStream",
        "logs:DescribeLogStreams"
      ],
      "Resource": [
        "arn:aws:logs:*:*:log-group:/aws/sagemaker/Clusters/*:log-stream:*"
      ]
    },
    {
      "Sid": "CloudwatchLogGroupCreationPermissions",
      "Effect": "Allow",
      "Action": ["logs:CreateLogGroup"],
      "Resource": ["arn:aws:logs:*:*:log-group:/aws/sagemaker/Clusters/*"]
    },
    {
      "Sid": "CloudwatchPutMetricDataAccess",
      "Effect": "Allow",
      "Action": ["cloudwatch:PutMetricData"],
      "Resource": ["*"],
      "Condition": {
        "StringEquals": {
          "cloudwatch:namespace": "/aws/sagemaker/Clusters"
        }
      }
    },
    {
      "Sid": "DataRetrievalFromS3BucketPermissions",
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetObject"],
      "Resource": ["arn:aws:s3:::sagemaker-*"],
      "Condition": {
        "StringEquals": {
          "aws:ResourceAccount": "${aws:PrincipalAccount}"
        }
      }
    },
    {
      "Sid": "SSMConnectivityPermissions",
      "Effect": "Allow",
      "Action": [
        "ssmmessages:CreateControlChannel",
        "ssmmessages:CreateDataChannel",
        "ssmmessages:OpenControlChannel",
        "ssmmessages:OpenDataChannel"
      ],
      "Resource": "*"
    }
  ]
}

https://docs.aws.amazon.com/ja_jp/aws-managed-policy/latest/reference/AmazonSageMakerClusterInstanceRolePolicy.html

VPC で利用するためのポリシー

vpc_policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:AssignPrivateIpAddresses",
        "ec2:CreateNetworkInterface",
        "ec2:CreateNetworkInterfacePermission",
        "ec2:DeleteNetworkInterface",
        "ec2:DeleteNetworkInterfacePermission",
        "ec2:DescribeNetworkInterfaces",
        "ec2:DescribeVpcs",
        "ec2:DescribeDhcpOptions",
        "ec2:DescribeSubnets",
        "ec2:DescribeSecurityGroups",
        "ec2:DetachNetworkInterface",
        "ec2:ModifyNetworkInterfaceAttribute",
        "ec2:UnassignPrivateIpAddresses",
        "ecr:BatchGetImage",
        "ecr:GetAuthorizationToken",
        "ecr:GetDownloadUrlForLayer",
        "eks-auth:AssumeRoleForPodIdentity"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateTags"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:network-interface/*"
      ]
    }
  ]
}

https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-prerequisites-iam.html#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod

EKS クラスターの IAM ロール

EKS クラスターの IAM ロールは AmazonEKSClusterPolicy をアタッチします。

AmazonEKSClusterPolicy.json
{
  "Version" : "2012-10-17",
  "Statement" : [
    {
      "Effect" : "Allow",
      "Action" : [
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:UpdateAutoScalingGroup",
        "ec2:AttachVolume",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:CreateRoute",
        "ec2:CreateSecurityGroup",
        "ec2:CreateTags",
        "ec2:CreateVolume",
        "ec2:DeleteRoute",
        "ec2:DeleteSecurityGroup",
        "ec2:DeleteVolume",
        "ec2:DescribeInstances",
        "ec2:DescribeRouteTables",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeSubnets",
        "ec2:DescribeVolumes",
        "ec2:DescribeVolumesModifications",
        "ec2:DescribeVpcs",
        "ec2:DescribeDhcpOptions",
        "ec2:DescribeNetworkInterfaces",
        "ec2:DescribeAvailabilityZones",
        "ec2:DetachVolume",
        "ec2:ModifyInstanceAttribute",
        "ec2:ModifyVolume",
        "ec2:RevokeSecurityGroupIngress",
        "ec2:DescribeAccountAttributes",
        "ec2:DescribeAddresses",
        "ec2:DescribeInternetGateways",
        "ec2:DescribeInstanceTopology",
        "elasticloadbalancing:AddTags",
        "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
        "elasticloadbalancing:AttachLoadBalancerToSubnets",
        "elasticloadbalancing:ConfigureHealthCheck",
        "elasticloadbalancing:CreateListener",
        "elasticloadbalancing:CreateLoadBalancer",
        "elasticloadbalancing:CreateLoadBalancerListeners",
        "elasticloadbalancing:CreateLoadBalancerPolicy",
        "elasticloadbalancing:CreateTargetGroup",
        "elasticloadbalancing:DeleteListener",
        "elasticloadbalancing:DeleteLoadBalancer",
        "elasticloadbalancing:DeleteLoadBalancerListeners",
        "elasticloadbalancing:DeleteTargetGroup",
        "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
        "elasticloadbalancing:DeregisterTargets",
        "elasticloadbalancing:DescribeListeners",
        "elasticloadbalancing:DescribeLoadBalancerAttributes",
        "elasticloadbalancing:DescribeLoadBalancerPolicies",
        "elasticloadbalancing:DescribeLoadBalancers",
        "elasticloadbalancing:DescribeTargetGroupAttributes",
        "elasticloadbalancing:DescribeTargetGroups",
        "elasticloadbalancing:DescribeTargetHealth",
        "elasticloadbalancing:DetachLoadBalancerFromSubnets",
        "elasticloadbalancing:ModifyListener",
        "elasticloadbalancing:ModifyLoadBalancerAttributes",
        "elasticloadbalancing:ModifyTargetGroup",
        "elasticloadbalancing:ModifyTargetGroupAttributes",
        "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
        "elasticloadbalancing:RegisterTargets",
        "elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer",
        "elasticloadbalancing:SetLoadBalancerPoliciesOfListener",
        "kms:DescribeKey"
      ],
      "Resource" : "*"
    },
    {
      "Effect" : "Allow",
      "Action" : "iam:CreateServiceLinkedRole",
      "Resource" : "*",
      "Condition" : {
        "StringEquals" : {
          "iam:AWSServiceName" : "elasticloadbalancing.amazonaws.com"
        }
      }
    }
  ]
}

https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKSClusterPolicy.html

必要に応じてカスタムポリシーを設定できますが、今回は省略します。

Before you can create Amazon EKS clusters, you must create an IAM role with either of the following IAM policies:

  • AmazonEKSClusterPolicy
  • A custom IAM policy. The minimal permissions that follow allows the Kubernetes cluster to manage nodes, but doesn’t allow the legacy Cloud Provider to create load balancers with Elastic Load Balancing. Your custom IAM policy must have at least the following permissions:

https://docs.aws.amazon.com/eks/latest/userguide/cluster-iam-role.html

CloudWatch Observability アドオンを利用する場合

タスクガバナンスや HyperPod コンソールのダッシュボード機能を利用したい時に CloudWatch Observability アドオンを EKS クラスターにインストールするケースがあります。その場合は、 CloudWatchAgentServerPolicy を HyperPod の IAM ロールに付与します。

CloudWatchAgentServerPolicy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CWACloudWatchServerPermissions",
      "Effect": "Allow",
      "Action": [
        "cloudwatch:PutMetricData",
        "ec2:DescribeVolumes",
        "ec2:DescribeTags",
        "logs:PutLogEvents",
        "logs:PutRetentionPolicy",
        "logs:DescribeLogStreams",
        "logs:DescribeLogGroups",
        "logs:CreateLogStream",
        "logs:CreateLogGroup",
        "xray:PutTraceSegments",
        "xray:PutTelemetryRecords",
        "xray:GetSamplingRules",
        "xray:GetSamplingTargets",
        "xray:GetSamplingStatisticSummaries"
      ],
      "Resource": "*"
    },
    {
      "Sid": "CWASSMServerPermissions",
      "Effect": "Allow",
      "Action": ["ssm:GetParameter"],
      "Resource": "arn:aws:ssm:*:*:parameter/AmazonCloudWatch-*"
    }
  ]
}

https://docs.aws.amazon.com/ja_jp/aws-managed-policy/latest/reference/CloudWatchAgentServerPolicy.html

管理者

EKS クラスター

EKS クラスターを管理するために以下の IAM を付与してあげます。以下はあくまで EKS クラスターに関してのポリシーです。

cluser_admin.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": <execution-role-arn>
    },
    {
      "Effect": "Allow",
      "Action": [
        "sagemaker:CreateCluster",
        "sagemaker:DeleteCluster",
        "sagemaker:DescribeCluster",
        "sagemaker:DescribeCluterNode",
        "sagemaker:ListClusterNodes",
        "sagemaker:ListClusters",
        "sagemaker:UpdateCluster",
        "sagemaker:UpdateClusterSoftware",
        "sagemaker:BatchDeleteClusterNodes",
        "eks:DescribeCluster",
        "eks:CreateAccessEntry",
        "eks:DescribeAccessEntry",
        "eks:DeleteAccessEntry",
        "eks:AssociateAccessPolicy",
        "iam:CreateServiceLinkedRole"
      ],
      "Resource": "*"
    }
  ]
}

Kubernetes

Kubernetes には、アクセスエントリで認可を管理してあげましょう。

AmazonEKSClusterAdminPolicy や AmazonEKSAdminPolicy が考えられます。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/access-policies.html#access-policy-permissions

なお、アクセスエントリは HyperPod クラスターのセットアップ時の Helm インストール時には登場するため、早めに設定しておく必要があります。

https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-eks-install-packages-using-helm-chart.html

研究者

研究者も同じくアクセスエントリでカバーできると良いでしょう。特定の名前空間向けに AmazonEKSAdminPolicy 等で許可できると良いと思います。

まとめ

以上、「SageMaker HyperPod クラスター起動で必要な IAM 周りをまとめてみた」でした。

このブログがどなたかの参考になれば幸いです。

クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.